package com.example.demokotlin

import org.junit.Test

/**
 * <pre>
 * author : zhouronghua
 * e-mail : zhouronghua01@dreamxr.com
 * time : 2023/04/07
 * desc : 类型转换
 * version: 1.0
 * </pre>
 */
class ClassCastTest {

    /**
     * 父类要求能够继承，需要使用open关键字。
     * KT类默认是public final的，不允许继承
     */
    open class Person(open val name: String = "匿名") {

        /**
         * 默认是public final的，需要重写，使用open关键字，允许子类重写
         */
        open fun print() {
            println("父类 打印 name: $name")
        }

        fun showPerson() {
            println("这是父类的 showPerson方法")
        }
    }

    class Student(override val name: String = "学生") : Person(name) {

        /**
         * 子类重写父类方法，需要父类定义为open
         *
         * @author zhouronghua
         * @time 2023/4/7 7:06 PM
         */
        override fun print() {
            println("子类 学生 打印 name: $name")
        }

        fun showStudent() {
            println("这是子类的 showStudent方法")
        }
    }

    @Test
    fun testClassCast() {
        // 测试类型判断
        println("=== is 对象类型判断 ===")
        val p: Person = Student()
        if (p is Person) {
            p.showPerson()
        }
        // 因为子类复写了方法，此处调用子类的print()方法
        p.print()
        println("=== as强制类型转换 ===")
        (p as Student).showStudent()
        // 强制类型转换以后，后面智能识别为子类对象
        p.print()
        // p智能识别为子类Student
        p.showStudent()
    }
}